package com.ddone.aop.annotation.advice;

import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author ddone
 * @date 2024/3/20-10:28
 */
@Component
public class DemoPointCut {
    /**
     * TODO：
     *  1.要求必须使用execution(切点表达式)包裹
     *  2.前两位是描述方法的访问修饰符和返回值
     *    public int | public void
     *    可以使用* 替代！ * 通配符 全部！
     *    * = 两个站位
     *  3. 第三位写包的地址
     *     具体写： com.atuigu.service.impl
     *     支持* ： com.atguigu.service.*
     *     支持 ..: com..service.impl  注意： ..不能放在第一位
     *     全部包： com..
     *  4.第四位就是类的描述
     *     具体写： CalculatorImpl
     *     使用* ： *   Calculator*
     *  5.第五位方法的描述
     *     具体写： add sub
     *     使用*： *
     *  6.第六位参数：
     *     (参数类型，注意区分包装和非包装类型)
     *     具体写： (int,int)
     *     使用..: (..) 不考虑参数类型
     *             (int..) 使用int开头
     *             (..String) 最后一个参数String
     *             (String..int)  第一个是String 最后一个是int
     *
     */
    @Pointcut("execution(* *..*.*(..))")
    public void pointCut1(){}
    /*
     * 切入点是某包某类的无参数的方法:
     *
     * execution(* com..类名.*())
     *
     * 切入点是某包某类带有参数的方法
     * execution(* com..类名.*(..))
     *
     * 切入点是某包某类的某个同名的所有方法
     * 示例：..  表示任意个数任意类型的参数
     * execution(* com..类名.方法名(..))
     *
     * 切入点是某包下的某类的所有方法
     * 示例：*表示任意的类名，方法名，包名
     *execution(* com..类名.*(..))
     *
     * 切入点是某包下的所有类的所有方法
     * 示例：* 表示任意的类名，方法名，包名
     * execution(* com..*.*(..))
     *
     * execution(* *..*.*(..))
     * execution(* com..*.*(..))
     */

    /*
     *
     * TODO:
     *   1.查询某包某类下，访问修饰符是公有，返回值是int的全部方法
     *     public int com.x.x.类名.*(..)
     *   2.查询某包下类中第一个参数是String的方法
     *     * com.xx.xx.类名.*(String..)
     *   3.查询全部包下，无参数的方法！
     *      * *..*.*()
     *   4.查询com包下，以int参数类型结尾的方法
     *      * com..*.*(..int)
     *   5.查询指定包下，Service开头类的私有返回值int的无参数方法
     *      private int com.xx.xx.Service*.*()
     */
}
